home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / sbin / alsaconf < prev    next >
Text File  |  2006-04-25  |  35KB  |  1,420 lines

  1. #!/bin/bash
  2. #
  3. #  ALSA Configurator
  4. #
  5. #  Copyright (c) 1999-2002  SuSE GmbH
  6. #                           Jan ONDREJ
  7. #
  8. #  written by Takashi Iwai <tiwai@suse.de>
  9. #             Bernd Kaindl <bk@suse.de>
  10. #             Jan ONDREJ (SAL) <ondrejj@salstar.sk>
  11. #
  12. #  based on the original version of Jan ONDREJ's alsaconf for ALSA 0.4.
  13. #
  14. #  This program is free software; you can redistribute it and/or modify
  15. #  it under the terms of the GNU General Public License as published by
  16. #  the Free Software Foundation; either version 2 of the License, or
  17. #  (at your option) any later version.
  18. #
  19.  
  20. export TEXTDOMAIN=alsaconf
  21.  
  22. prefix=/usr
  23. exec_prefix=${prefix}
  24. bindir=${exec_prefix}/bin
  25. sbindir=${exec_prefix}/sbin
  26. version=1.0.11
  27. USE_NLS=no
  28.  
  29. # Useful for debugging
  30. PROCFS="/proc"
  31. SYSFS="/sys"
  32.  
  33. # i18n stuff
  34. if test "$USE_NLS" = "yes" && which gettext > /dev/null; then
  35.   xecho() {
  36.     gettext -s "$*"
  37.   }
  38. else
  39.   xecho() {
  40.     echo "$*"
  41.   }
  42.   gettext() {
  43.     echo -n "$*"
  44.   }
  45. fi
  46. xmsg() {
  47.   msg=$(gettext "$1")
  48.   shift
  49.   printf "$msg" $*
  50. }
  51.  
  52. # Check for GNU/Linux distributions
  53. if [ -f /etc/SuSE-release ]; then
  54.   distribution="suse"
  55.   suse_version=$(grep 'VERSION = ' /etc/SuSE-release | sed -e s/'VERSION = '//)
  56. elif [ -f /etc/UnitedLinux-release ]; then
  57.   distribution="suse"
  58. elif [ -f /etc/gentoo-release ]; then
  59.   distribution="gentoo"
  60. elif [ -f /etc/debian_version ]; then
  61.   distribution="debian"
  62. elif [ -f /etc/mandrake-release ]; then
  63.   distribution="mandrake"
  64. elif test -f /etc/redhat-release && grep -q "Red Hat" /etc/redhat-release; then
  65.   distribution="redhat"
  66. elif test -f /etc/fedora-release && grep -q "Fedora" /etc/fedora-release; then
  67.   distribution="fedora"
  68. else
  69.   distribution="unknown"
  70. fi
  71.  
  72. for prog in lspci lsmod; do
  73.     for path in /sbin /usr/sbin /bin /usr/bin;do
  74.         test -x $path/$prog && eval $prog=$path/$prog
  75.     done
  76. done
  77. unset prog path
  78.  
  79. usage() {
  80.     xecho "ALSA configurator"
  81.     echo "  version $version"
  82.     xecho "usage: alsaconf [options]
  83.   -l|--legacy    check only legacy non-isapnp cards
  84.   -m|--modinfo   read module descriptions instead of reading card db
  85.   -s|--sound wav-file
  86.                  use the specified wav file as a test sound
  87.   -u|--uid uid   set the uid for the ALSA devices (default = 0) [obsoleted]
  88.   -g|--gid gid   set the gid for the ALSA devices (default = 0) [obsoleted]
  89.   -d|--devmode mode
  90.                  set the permission for ALSA devices (default = 0666) [obs.]
  91.   -r|--strict    set strict device mode (equiv. with -g 17 -d 0660) [obsoleted]
  92.   -L|--log file  logging on the specified file (for debugging purpose only)
  93.   -p|--probe card-name
  94.                  probe a legacy non-isapnp card and print module options
  95.   -P|--listprobe list the supported legacy card modules
  96.   -c|--config file
  97.                  specify the module config file
  98.   -R|--resources list available DMA and IRQ resources with debug for legacy
  99.   -h|--help      what you're reading"
  100. }
  101.  
  102. OPTS=`getopt -o lmL:hp:Pu:g:d:rs:c:R --long legacy,modinfo,log:,help,probe:,listprobe,uid:,gid:,devmode:,strict,sound:,config:,resources -n alsaconf -- "$@"` || exit 1
  103. eval set -- "$OPTS"
  104.  
  105. do_legacy_only=0
  106. use_modinfo_db=0
  107. alsa_uid=0
  108. alsa_gid=0
  109. alsa_mode=0666
  110. legacy_probe_card=""
  111. LOGFILE=""
  112. TESTSOUND="/usr/share/sounds/alsa/test.wav"
  113. try_all_combination=0
  114. resources="false"
  115.  
  116. # legacy support
  117. LEGACY_CARDS="opl3sa2 cs4236 cs4232 cs4231 es18xx es1688 sb16 sb8"
  118.  
  119. while true ; do
  120.     case "$1" in
  121.     -l|--legacy)
  122.     do_legacy_only=1; shift ;;
  123.     -m|--modinfo)
  124.     use_modinfo_db=1; shift ;;
  125.     -s|--sound)
  126.     TESTSOUND=$2; shift 2;;
  127.     -h|--help)
  128.     usage; exit 0 ;;
  129.     -L|--log)
  130.     LOGFILE="$2"; shift 2;;
  131.     -p|--probe)
  132.     legacy_probe_card="$2"; shift 2;;
  133.     -P|--listprobe)
  134.     echo "$LEGACY_CARDS"; exit 0;;
  135.     -u|--uid)
  136.     alsa_uid="$2"; shift 2;;
  137.     -g|--gid)
  138.     alsa_gid="$2"; shift 2;;
  139.     -d|--devmode)
  140.     alsa_mode="$2"; shift 2;;
  141.     -r|--strict)
  142.     alsa_uid=0; alsa_gid=17; alsa_mode=0660; shift;;
  143.     -c|--config)
  144.     cfgfile="$2"; shift 2;;
  145.     -R|--resources)
  146.         resources="true"; shift;;
  147.     --) shift ; break ;;
  148.     *) usage ; exit 1 ;;
  149.     esac
  150. done
  151.  
  152. #
  153. # probe legacy ISA cards
  154. #
  155.  
  156. check_dma_avail () {
  157.     list=""
  158.     if [ -d $SYSFS/bus/pnp/devices ]; then
  159.       for dma in $*; do
  160.         ok="true"
  161.         for i in $SYSFS/bus/pnp/devices/??:* ; do
  162.           if grep -q "state = active" $i/resources ; then
  163.             if grep -q '^dma '$dma'$' $i/resources; then
  164.               ok="false"
  165.             fi
  166.           fi
  167.         done
  168.         if [ -r $PROCFS/dma ]; then
  169.       if grep -q '^ *'$dma': ' $PROCFS/dma ; then
  170.             ok="false"
  171.           fi
  172.     fi
  173.         if [ "$ok" = "true" ]; then
  174.           list="$list $dma"
  175.         fi
  176.       done
  177.     else
  178.       if [ -r $PROCFS/dma ]; then
  179.       for dma in $*; do
  180.         grep -q '^ *'$dma': ' $PROCFS/dma || list="$list $dma"
  181.     done
  182.       fi
  183.     fi
  184.     if [ ! -z "$list" ]; then
  185.       echo $list
  186.     fi
  187. }
  188.  
  189. check_irq_avail () {
  190.     list=""
  191.     if [ -d $SYSFS/bus/pnp/devices ]; then
  192.       for irq in $*; do
  193.         ok="true"
  194.         for i in $SYSFS/bus/pnp/devices/??:* ; do
  195.           if grep -q "state = active" $i/resources ; then
  196.             if grep -q '^irq '$irq'$' $i/resources; then
  197.               ok="false"
  198.             fi
  199.           fi
  200.         done
  201.         if [ -r $PROCFS/interrupts ]; then
  202.       if grep -q '^ *'$irq': ' $PROCFS/interrupts ; then
  203.             ok="false"
  204.           fi
  205.     fi
  206.         if [ "$ok" = "true" ]; then
  207.           list="$list $irq"
  208.         fi
  209.       done
  210.     else
  211.       if [ -r $PROCFS/interrupts ]; then
  212.     for irq in $*; do
  213.         grep -q '^ *'$irq': ' $PROCFS/interrupts || list="$list $irq"
  214.     done
  215.       fi
  216.     fi
  217.     if [ ! -z "$list" ]; then
  218.       echo $list
  219.     fi
  220. }
  221.  
  222. #
  223. #
  224. #
  225.  
  226. if [ "$resources" = "true" ]; then
  227.   if [ -d $SYSFS/bus/pnp/devices ]; then
  228.     for i in $SYSFS/bus/pnp/devices/??:* ; do
  229.       if [ "$resources" = "true" ]; then
  230.         echo ">>>>> PnP file: $i/resources"
  231.         cat $i/resources
  232.       fi
  233.     done
  234.   fi
  235.   if [ -r $PROCFS/dma ]; then
  236.     echo ">>>>> Allocated dma channels:"
  237.     cat $PROCFS/dma
  238.   fi
  239.   if [ -r $PROCFS/interrupts ]; then
  240.     echo ">>>>> Allocated interrupt channels:"
  241.     cat $PROCFS/interrupts
  242.   fi
  243.   echo -n "Valid DMA channels: "
  244.   check_dma_avail 0 1 2 3 4 5 6 7
  245.   echo -n "Valid IRQ channels: "
  246.   check_irq_avail 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  247.   exit 0
  248. fi
  249.  
  250. # Check for root privileges
  251. if [ `id -u` -ne 0 ]; then
  252.   xecho "You must be root to use this script."
  253.   exit 1
  254. fi
  255.  
  256. #
  257. # check the snd_ prefix for ALSA module options
  258. # snd_ prefix is obsoleted since 0.9.0rc4.
  259. #
  260. if /sbin/modinfo -p snd | grep -q snd_ ; then
  261.   mpfx="snd_"
  262. else
  263.   mpfx=""
  264. fi
  265.  
  266. alsa_device_opts=""
  267. if /sbin/modinfo -p snd | grep -q uid ; then
  268.   if [ x"$alsa_uid" != x0 ]; then
  269.     alsa_device_opts="$alsa_device_opts ${mpfx}device_uid=$alsa_uid"
  270.   fi
  271.   if [ x"$alsa_gid" != x0 ]; then
  272.     alsa_device_opts="$alsa_device_opts ${mpfx}device_gid=$alsa_gid"
  273.   fi
  274. fi
  275. if /sbin/modinfo -p snd | grep -q device_mode ; then
  276.   if [ x"$alsa_mode" != x0 ]; then
  277.     alsa_device_opts="$alsa_device_opts ${mpfx}device_mode=$alsa_mode"
  278.   fi
  279. fi
  280.  
  281. case `uname -r` in
  282. 2.6.*)
  283.   kernel="new"
  284.   ;;
  285. *)
  286.   kernel="old"
  287.   ;;
  288. esac
  289.  
  290. # cfgfile = base config file to remove/update the sound setting
  291. # cfgout = new config file to write the sound setting (if different from $cfgfile)
  292. if [ -n "$cfgfile" ]; then
  293.   if [ ! -r "$cfgfile" ]; then
  294.     xecho "ERROR: The config file doesn't exist: "
  295.     echo $cfgfile
  296.     exit 1
  297.   fi
  298. else
  299. if [ "$distribution" = "gentoo" ]; then
  300.   cfgfile="/etc/modules.d/alsa"
  301. elif [ "$kernel" = "new" ]; then
  302.   if [ -d /etc/modprobe.d ]; then
  303.     cfgout="/etc/modprobe.d/sound"
  304.   fi
  305.   cfgfile="/etc/modprobe.conf"
  306. elif [ "$distribution" = "debian" ]; then
  307.   cfgfile="/etc/modutils/sound"
  308. elif [ -e /etc/modules.conf ]; then
  309.   cfgfile="/etc/modules.conf"
  310. elif [ -e /etc/conf.modules ]; then
  311.   cfgfile="/etc/conf.modules"
  312. else
  313.   cfgfile="/etc/modules.conf"
  314.   touch /etc/modules.conf
  315. fi
  316. fi
  317.  
  318. # Check for dialog, whiptail, gdialog, awk, ... ?
  319. if which dialog > /dev/null; then
  320.     DIALOG=dialog
  321. else
  322.   if which whiptail > /dev/null; then
  323.     whiptail_wrapper() {
  324.       X1="$1"
  325.       X2="$2"
  326.       if [ $1 = --yesno ]; then
  327.         X3=`expr $3 + 2`
  328.       else
  329.         X3=$3
  330.       fi
  331.       shift 3
  332.       whiptail "$X1" "$X2" $X3 "$@"
  333.     }
  334.     DIALOG=whiptail_wrapper
  335.   else
  336.     xecho "Error, dialog or whiptail not found."
  337.     exit 1
  338.   fi
  339. fi
  340. if which awk > /dev/null; then :
  341. else
  342.   xecho "Error, awk not found. Can't continue."
  343.   exit 1
  344. fi
  345.  
  346. #
  347. # remove entries by yast2 sound configurator
  348. #
  349. remove_y2_block() {
  350.     awk '
  351.     /^alias sound-slot-[0-9]/ { next }
  352.     /^alias char-major-116 / { next }
  353.     /^alias char-major-14 / { next }
  354.     /^alias snd-card-[0-9] / { next }
  355.     /^options snd / { next }
  356.     /^options snd-/ { next }
  357.     /^options off / { next }
  358.     /^alias sound-service-[0-9]/ { next }
  359.     /^# YaST2: sound / { next }
  360.    { print }'
  361. }
  362.  
  363. #
  364. # remove entries by sndconfig sound configurator
  365. #
  366. # found strings to search for in WriteConfModules, 
  367. # from sndconfig 0.68-4 (rawhide version)
  368.  
  369. remove_sndconfig_block() {
  370.     awk '
  371.     /^alias sound-slot-0/ { modulename = $3 ; next }
  372.     /^alias sound-slot-[0-9]/ { next }
  373.     /^post-install sound-slot-[0-9] / { next }
  374.     /^pre-remove sound-slot-[0-9] / { next }
  375.     /^options sound / { next }
  376.     /^alias synth0 opl3/ { next }
  377.     /^options opl3 / { next }
  378.     /^alias midi / { mididev = $3 ; next }
  379.     /^options / { if ($2 == mididev) next }
  380.     /^pre-install / { if ($2 == mididev) next }
  381.     /^alias synth0 / { synth = $3 ; next }
  382.     /^post-install / { if ($2 == synth) next }
  383.     /^options sb / { next }
  384.     /^post-install .+ \/bin\/modprobe "aci"/ { if ($2 == modulename) next }
  385.     /^options adlib_card / { next }
  386.     /^options .+ isapnp=1/ { if ($2 == modulename) next }
  387.     /^options i810_audio / { next }
  388.     /^options / {if ($2 == modulename) next }
  389.    { print }'
  390. }
  391.  
  392. #
  393. # remove the previous configuration by alsaconf
  394. #
  395. remove_ac_block() {
  396.     awk '/^'"$ACB"'$/,/^'"$ACE"'$/ { next } { print }'
  397. }
  398.  
  399. #
  400. # set default mixer volumes
  401. #
  402. set_mixers() {
  403.     amixer -s -q <<EOF
  404. set Master 75% unmute
  405. set 'Master Mono' 75% unmute
  406. set Front 75% unmute
  407. set PCM 90% unmute
  408. mixer Synth 90% unmute
  409. mixer CD 90% unmute
  410. # mute mic
  411. set Mic 0% mute
  412. # ESS 1969 chipset has 2 PCM channels
  413. set PCM,1 90% unmute
  414. # Trident/YMFPCI/emu10k1
  415. set Wave 100% unmute
  416. set Music 100% unmute
  417. set AC97 100% unmute
  418. # CS4237B chipset:
  419. set 'Master Digital' 75% unmute
  420. # Envy24 chips with analog outs
  421. set DAC 90% unmute
  422. set DAC,0 90% unmute
  423. set DAC,1 90% unmute
  424. # some notebooks use headphone instead of master
  425. set Headphone 75% unmute
  426. set Playback 100% unmute
  427. # turn off digital switches
  428. set "SB Live Analog/Digital Output Jack" off
  429. set "Audigy Analog/Digital Output Jack" off
  430. EOF
  431. }
  432.  
  433.  
  434. # INTRO
  435. intro() {
  436.   local msg=$(xmsg "
  437.                    ALSA  CONFIGURATOR
  438.                    version %s
  439.  
  440.             This script is a configurator for
  441.     Advanced Linux Sound Architecture (ALSA) driver.
  442.  
  443.  
  444.   If ALSA is already running, you should close all sound
  445.   apps now and stop the sound driver.
  446.   alsaconf will try to do this, but it's not 100%% sure." $version)
  447.   $DIALOG --msgbox "$msg" 20 63 || acex 0
  448. }
  449.  
  450. # FAREWELL
  451. farewell() {
  452.   local msg=$(gettext "
  453.  
  454.      OK, sound driver is configured.
  455.  
  456.                   ALSA  CONFIGURATOR
  457.  
  458.           will prepare the card for playing now.
  459.  
  460.      Now I'll run alsasound init script, then I'll use
  461.      amixer to raise the default volumes.
  462.      You can change the volume later via a mixer
  463.      program such as alsamixer or gamix.
  464.   
  465.   ")
  466.   $DIALOG --msgbox "$msg" 17 60 || acex 0
  467. }
  468.  
  469. # Exit function
  470. acex() {
  471.   cleanup
  472.   clear
  473.   exit $1
  474. }
  475.  
  476. #
  477. # search for alsasound init script
  478. #
  479.  
  480. if [ "$distribution" = "debian" ]; then
  481.     rcalsasound=/etc/init.d/alsa
  482. elif [ -x /etc/init.d/alsasound ]; then
  483.     rcalsasound=/etc/init.d/alsasound
  484. elif [ -x /usr/sbin/rcalsasound ]; then
  485.     rcalsasound=/usr/sbin/rcalsasound
  486. elif [ -x /sbin/rcalsasound ]; then
  487.     rcalsasound=/sbin/rcalsasound
  488. elif [ -x /etc/rc.d/init.d/alsasound ]; then
  489.     rcalsasound=/etc/rc.d/init.d/alsasound
  490. elif [ -x /etc/init.d/alsa ]; then
  491.     rcalsasound=/etc/init.d/alsa
  492. else
  493.     rcalsasound=rcalsasound
  494. fi
  495.  
  496.     
  497. # MAIN
  498. if [ -d $PROCFS/asound ]; then
  499.   $rcalsasound stop >/dev/null 2>&1
  500.   $rcalsasound unload >/dev/null 2>&1
  501.   /sbin/rmmod dmasound dmasound_awacs 2>/dev/null
  502. fi
  503.  
  504.  
  505. cleanup () {
  506.     killall -9 aplay arecord >/dev/null 2>&1
  507.     /sbin/modprobe -r isapnp >/dev/null 2>&1
  508.     /sbin/modprobe -r isa-pnp >/dev/null 2>&1
  509.     rm -f "$TMP" "$addcfg" "$FOUND" "$DUMP"
  510. }
  511. trap cleanup 0 
  512.  
  513. TMP=`mktemp -q /tmp/alsaconf.XXXXXX`
  514. if [ $? -ne 0 ]; then
  515.     xecho "Can't create temp file, exiting..."
  516.         exit 1
  517. fi
  518. addcfg=`mktemp -q /tmp/alsaconf.XXXXXX`
  519. if [ $? -ne 0 ]; then
  520.     xecho "Can't create temp file, exiting..."
  521.         exit 1
  522. fi
  523. FOUND=`mktemp -q /tmp/alsaconf.XXXXXX`
  524. if [ $? -ne 0 ]; then
  525.     xecho "Can't create temp file, exiting..."
  526.         exit 1
  527. fi
  528. DUMP=`mktemp -q /tmp/alsaconf.XXXXXX`
  529. if [ $? -ne 0 ]; then
  530.     xecho "Can't create temp file, exiting..."
  531.         exit 1
  532. fi
  533.  
  534. # convert ISA PnP id number to string 'ABC'
  535. convert_isapnp_id () {
  536.     if [ -z "$1" ]; then
  537.     echo "XXXX"
  538.     return
  539.     fi
  540.     let a='('$1'>>2) & 0x3f'
  541.     let b='(('$1' & 0x03) << 3) | (('$1' >> 13) & 0x07)'
  542.     let c='('$1'>> 8) & 0x1f'
  543.     strs='@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  544.     echo ${strs:$a:1}${strs:$b:1}${strs:$c:1}
  545. }
  546.  
  547. # swap high & low bytes
  548. swap_number () {
  549.     if [ -z "$1" ]; then
  550.     echo "0000"
  551.     return
  552.     fi
  553.     let v='(('$1'>>8)&0xff)|(('$1'&0xff)<<8)'
  554.     printf "%04x" $v
  555. }
  556.  
  557. # build card database
  558. # build_card_db filename
  559. build_card_db () {
  560.     MODDIR=/lib/modules/`uname -r`
  561.     last_driver=""
  562.     echo -n > $1
  563.  
  564.     # list pci cards
  565.     while read driver vendor device dummy; do
  566.     if expr $driver : 'snd-.*' >/dev/null ; then
  567.         if [ "$last_driver" != "$driver" ]; then
  568.         echo $driver.o
  569.         last_driver=$driver
  570.         fi
  571.         id1=`printf '0x%04x' $vendor`
  572.         id2=`printf '0x%04x' $device`
  573.         echo "PCI: $id1=$id2"
  574.     fi
  575.     done < $MODDIR/modules.pcimap >> $1
  576.  
  577.     # list isapnp cards
  578.     while read driver cardvendor carddevice data vendor func; do
  579.     if expr $driver : 'snd-.*' >/dev/null ; then
  580.         if [ "$last_driver" != "$driver" ]; then
  581.         echo $driver.o
  582.         last_driver=$driver
  583.         fi
  584.         id1=`convert_isapnp_id $cardvendor`
  585.         dev1=`swap_number $carddevice`
  586.         id2=`convert_isapnp_id $vendor`
  587.         dev2=`swap_number $func`
  588.         echo "ISAPNP: $id1$dev1=$id2$dev2"
  589.     fi
  590.     done < $MODDIR/modules.isapnpmap >> $1
  591. }
  592.  
  593. #
  594. # probe cards
  595. #
  596. probe_cards () {
  597.     found="0"
  598.     test -r $PROCFS/isapnp || /sbin/modprobe isapnp >/dev/null 2>&1
  599.     test -r $PROCFS/isapnp || /sbin/modprobe isa-pnp >/dev/null 2>&1
  600.     if [ -r $PROCFS/isapnp ]; then
  601.     cat $PROCFS/isapnp >"$DUMP"
  602.     found="1"
  603.     elif [ -d $SYSFS/bus/pnp/devices ]; then
  604.     # use 2.6 kernel's sysfs output
  605.     # fake the isapnp dump
  606.     index=0
  607.     bindex=0
  608.     for d1 in $SYSFS/devices/pnp* ; do
  609.       for d2 in $d1/*:* ; do
  610.         if [ -r $d2/card_id ]; then
  611.           id=`cat $d2/card_id`
  612.           name=`cat $d2/name`
  613.           echo "Card $index '$id:$name' " >> "$DUMP"
  614.           index=$[$index+1]
  615.           found="1"
  616.         else if [ -r $d2/id ]; then
  617.           # FIXME: multiple id might be present (separated with new-line)
  618.           id=`head -n 1 $d2/id`
  619.           echo "BIOS $bindex '$id' " >> "$DUMP"
  620.           bindex=$[$bindex+1]
  621.           found="1"
  622.         fi
  623.         fi
  624.       done
  625.     done
  626.     fi
  627.     if [ "$found" = "0" ]; then
  628.       echo -n >"$DUMP"
  629.     fi 
  630.     CARDID_DB=/var/tmp/alsaconf.cards
  631.     if [ ! -r $CARDID_DB ]; then
  632.         use_modinfo_db=1
  633.     fi
  634.     if [ $use_modinfo_db != 1 ]; then
  635.     if [ $CARDID_DB -ot /lib/modules/`uname -r`/modules.dep ]; then
  636.         use_modinfo_db=1
  637.     fi
  638.     fi
  639.     if [ $use_modinfo_db = 1 ]; then
  640.     xecho "Building card database.."
  641.     build_card_db $CARDID_DB
  642.     fi
  643.     if [ ! -r $CARDID_DB ]; then
  644.     xecho "No card database is found.."
  645.     exit 1
  646.     fi
  647.     ncards=`grep '^snd-.*\.o$' $CARDID_DB | wc -w`
  648.  
  649.     msg=$(gettext "Searching sound cards")
  650.     awk '
  651. BEGIN {
  652.     format="%-40s %s\n";
  653.     ncards='"$ncards"';
  654.     idx=0;
  655. }
  656. /^snd-.*\.o$/{
  657.     sub(/.o$/, "");
  658.     driver=$0;
  659.     perc=(idx * 100) / (ncards + 1);
  660.     print int(perc);
  661.     idx++;
  662. }
  663. /^[<literal space><literal tab>]*PCI: /{
  664.     gsub(/0x/, "");
  665.     gsub(/=/, ":");
  666.     x = sprintf ("'$lspci' -n 2>/dev/null| grep '"' 04..: '"' | grep %s", $2);
  667.     if (system (x) == 0)
  668.         printf "%s %s\n", $2, driver >>"'"$FOUND"'"
  669. }
  670. /^[<literal space><literal tab>]*ISAPNP: /{
  671.     id2 = substr($0, index($0, "=")+1);
  672.     gsub(/=.*/, "");
  673.     x = sprintf ("grep '\''^Card [0-9] .%s:'\'' '"$DUMP"'", $2);
  674.     if (system (x) == 0)
  675.         printf "%s %s\n", $2, driver >>"'"$FOUND"'"
  676.     else if (index($2, "ffff") > 0) {
  677.         x = sprintf ("grep '\''^BIOS [0-9]* .%s.'\'' '"$DUMP"'", id2);
  678.         if (system (x) == 0)
  679.             printf "%s %s\n", id2, driver >>"'"$FOUND"'"
  680.     }
  681. }' < $CARDID_DB |\
  682.     $DIALOG --gauge "$msg" 6 40 0
  683.  
  684.     #
  685.     # PowerMac
  686.     #
  687.     if grep -q MacRISC $PROCFS/cpuinfo; then
  688.     MODDIR=/lib/modules/`uname -r`
  689.     find $MODDIR -name 'snd-powermac' -print | \
  690.     while read i; do
  691.         i=${i##*/}
  692.         i=${i%%.o}
  693.         i=${i%%.ko}
  694.         echo "PowerMac $i" >> $FOUND
  695.     done
  696.     fi
  697.  
  698.     #
  699.     # Sparc
  700.     #
  701.     if grep -q Sparc $PROCFS/cpuinfo; then
  702.     test -r $PROCFS/openprom/name || /bin/mount -t openpromfs none $PROCFS/openprom >/dev/null 2>&1
  703.     # Check for an "audio" device
  704.     audio=
  705.     compat=
  706.     if test -r $PROCFS/openprom; then
  707.         audio=`find $PROCFS/openprom -follow -type d -name "audio*" -print`
  708.     fi
  709.     if test -n "$audio"; then
  710.         compat=`cat $audio/compatible`
  711.         compat=${compat#\'}
  712.         compat=${compat%\'}
  713.         compat=${compat#SUNW,}
  714.     fi
  715.     # Go through all cards we have
  716.     MODDIR=/lib/modules/`uname -r`
  717.     find $MODDIR -name 'snd-sun-*' -print | \
  718.     while read i; do
  719.         i=${i##*/}
  720.         i=${i%%.o}
  721.         i=${i%%.ko}
  722.         sdev=`echo ${i#snd-sun-} | tr "[a-z]" "[A-Z]"`
  723.  
  724.         if test "$sdev" = "$compat"; then
  725.         echo "$sdev $i" >> $FOUND
  726.         elif test -r $PROCFS/openprom; then
  727.         find $PROCFS/openprom -follow -type d -name "SUNW,${sdev}*" \
  728.             -exec echo "$sdev $i" \; 2>/dev/null >> $FOUND
  729.         else
  730.         echo "$sdev $i" >> $FOUND
  731.         fi
  732.     done
  733.     fi
  734. }
  735.  
  736. #
  737. # look for a descriptive device name from the given device id
  738. #
  739. find_device_name () {
  740.     if expr "$1" : '[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then
  741.     $lspci -d $1 2>/dev/null| sed -e 's/^.*:..\.. [^:]*: //g'
  742.     return
  743.     elif expr "$1" : '[A-Z@][A-Z@][A-Z@][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then
  744.     cardname=`grep '^Card [0-9]\+ .'$1':' $DUMP | head -n 1 | sed -e 's/^Card [0-9]\+ '\''.*:\(.*\)'\'' .*$/\1/'`
  745.     echo $cardname
  746.     else
  747.     echo $1
  748.     fi
  749. }
  750.  
  751. # get hwcfg file type from the given driver name
  752. get_hwcfg_type () {
  753.     while read dev driver; do
  754.     if [ "$driver" = "$1" ]; then
  755.         case "$dev" in
  756.         *:*)
  757.         # FIXME: need to look around /sys/bus/pci/* (or use vpid-* ?)
  758.         devid=`$lspci -d "$dev" | head -n 1 | sed -e 's/ .*$//'`
  759.         case "$devid" in
  760.         *:*:*.*) ;;
  761.         *) devid="0000:$devid" ;;
  762.         esac
  763.         echo bus-pci-$devid
  764.         ;;
  765.         *)
  766.         echo $driver
  767.         ;;
  768.         esac
  769.         break
  770.     fi
  771.     done
  772. }
  773.  
  774. # clean up all hwcfg-* files containing ALSA modules
  775. # alsaconf sets up exclusively
  776. cleanup_hwcfg () {
  777.     for i in /etc/sysconfig/hardware/hwcfg-*; do
  778.     grep -q "MODULE='snd-" $i && rm -f $i
  779.     done
  780. }
  781.  
  782. #
  783. # set up /etc/sysconfig/hardware/hwcfg-* stuff
  784. #
  785. setup_hwcfg () {
  786.     card=$1
  787.     cleanup_hwcfg
  788.     cfg=`echo "$devs_olist" | get_hwcfg_type $card`
  789.     echo "MODULE='$card'" > /etc/sysconfig/hardware/hwcfg-$cfg
  790.     echo "STARTMODE='auto'" >> /etc/sysconfig/hardware/hwcfg-$cfg
  791. }
  792.  
  793.  
  794. #
  795. # configure and try test sound
  796. #
  797. ac_config_card () {
  798.  
  799.     CARD_DRIVER=snd-$1
  800.     CARD_OPTS="${*:2}"
  801.  
  802.     if [ -n "$cfgout" ]; then
  803.     msg=$(xmsg "
  804. Configuring %s
  805. Do you want to modify %s (and %s if present)?" $CARD_DRIVER $cfgout $cfgfile)
  806.         $DIALOG --yesno "$msg" 8 50 || acex 0
  807.     else
  808.     msg=$(xmsg "
  809. Configuring %s
  810. Do you want to modify %s?" $CARD_DRIVER $cfgfile)
  811.         $DIALOG --yesno "$msg" 8 50 || acex 0
  812.     fi
  813.     clear
  814.  
  815.     # Copy conf.modules and make changes.
  816.     ACB="# --- BEGIN: Generated by ALSACONF, do not edit. ---"
  817.     ACE="# --- END: Generated by ALSACONF, do not edit. ---"
  818.  
  819.     # Detect 2.2.X kernel
  820.     KVER=`uname -r | tr ".-" "  "`
  821.     KVER1=`echo $KVER | cut -d" " -f1`
  822.     KVER2=`echo $KVER | cut -d" " -f2`
  823.     if [ $KVER1 -ge 2 ] && [ $KVER2 -ge 2 ]; then
  824.     SOUND_CORE="soundcore"
  825.     else
  826.     SOUND_CORE="snd"
  827.     fi
  828.  
  829.     if [ -r $cfgfile ] ; then
  830.         if [ "$distribution" = "redhat" -o "$distribution" = "fedora" ] ; then
  831.             remove_ac_block < $cfgfile | remove_sndconfig_block | uniq > $TMP
  832.         else
  833.         remove_ac_block < $cfgfile | remove_y2_block | uniq > $TMP
  834.         fi
  835.     fi
  836.  
  837.     if [ -z "$have_alias" -a "$kernel" = "new" ]; then
  838.     if grep -q char-major-116 /lib/modules/`uname -r`/modules.alias; then
  839.         have_alias="yes"
  840.     fi
  841.     fi
  842.     if [ -z "$have_alias" ]; then
  843. echo "alias char-major-116 snd
  844. alias char-major-14 $SOUND_CORE
  845. alias sound-service-0-0 snd-mixer-oss
  846. alias sound-service-0-1 snd-seq-oss
  847. alias sound-service-0-3 snd-pcm-oss
  848. alias sound-service-0-8 snd-seq-oss
  849. alias sound-service-0-12 snd-pcm-oss" >> $addcfg
  850.     fi
  851.     if [ -n "$alsa_device_opts" ]; then
  852.     echo "options snd $alsa_device_opts" >> $addcfg
  853.     fi
  854. echo "alias snd-card-0 $CARD_DRIVER
  855. alias sound-slot-0 $CARD_DRIVER" >> $addcfg
  856.     if [ -n "$CARD_OPTS" ]; then
  857.     echo "options $CARD_DRIVER $CARD_OPTS" >> $addcfg
  858.     fi
  859.  
  860.     if [ -n "$cfgout" ]; then
  861.     [ ! -r "$cfgfile" ] || cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile"
  862.     cmp -s "$addcfg" "$cfgout" || cat "$addcfg" > "$cfgout"
  863.     else
  864.     echo "$ACB
  865. # --- ALSACONF version $version ---" >> $TMP
  866.         cat "$addcfg" >> "$TMP"
  867.     echo "$ACE
  868. " >> $TMP
  869.         cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile"
  870.     fi
  871.  
  872.     /sbin/depmod -a 2>/dev/null
  873.  
  874.     # remove yast2 entries (- only for suse distro)
  875.     if [ -f /var/lib/YaST/unique.inf ]; then
  876.     awk '
  877. BEGIN { in_sound=0; }
  878. /^\[sound\]$/ { print; in_sound=1; next; }
  879. /^\[.+\]$/ { print; in_sound=0; next; }
  880. { if (in_sound == 0) { print; } }
  881. ' < /var/lib/YaST/unique.inf > $TMP
  882.     cp -f $TMP /var/lib/YaST/unique.inf
  883.     fi
  884.  
  885.     # set up /etc/sysconfig/hardware/*
  886.     if [ "$distribution" = "suse" ]; then
  887.     case "$suse_version" in
  888.     10.*)
  889.         setup_hwcfg $CARD_DRIVER
  890.         ;;
  891.     esac
  892.     fi
  893.  
  894.     farewell
  895.     clear
  896.     if [ "$distribution" = "gentoo" ]; then
  897.       xecho "Running modules-update..."
  898.       modules-update
  899.     elif [ "$distribution" = "debian" ]; then
  900.       xecho "Running update-modules..."
  901.       update-modules
  902.     fi
  903.     echo Loading driver...
  904.     $rcalsasound restart
  905.     echo Setting default volumes...
  906.     if [ -x $bindir/set_default_volume ]; then
  907.     $bindir/set_default_volume -f
  908.     else
  909.     set_mixers
  910.     fi
  911.     if [ -f $TESTSOUND ]; then
  912.       msg=$(gettext "
  913.        The mixer is set up now for for playing.
  914.        Shall I try to play a sound sample now?
  915.  
  916.                            NOTE:
  917. If you have a big amplifier, lower your volumes or say no.
  918.     Otherwise check that your speaker volume is open,
  919.           and look if you can hear test sound.
  920. ")
  921.       if $DIALOG --yesno "$msg" 13 65 
  922.       then
  923.           clear
  924.       echo
  925.       aplay -N $TESTSOUND
  926.       fi
  927.     fi
  928.     if [ ! -r /etc/asound.state ]; then
  929.     xecho "Saving the mixer setup used for this in /etc/asound.state."
  930.     $sbindir/alsactl store
  931.     fi
  932.     clear
  933.     xecho "
  934. ===============================================================================
  935.  
  936.  Now ALSA is ready to use.
  937.  For adjustment of volumes, use your favorite mixer.
  938.  
  939.  Have a lot of fun!
  940.  
  941. "
  942. }
  943.  
  944. # check playback
  945. # return 0 - OK, 1 - NG, 2 - not working (irq/dma problem)
  946. ac_try_load () {
  947.     test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE"
  948.     /sbin/modprobe snd-$1 ${*:2} >/dev/null 2>&1
  949.     if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then
  950.     : ;
  951.     else
  952.     /sbin/modprobe -r snd-$1 >/dev/null 2>&1
  953.     return 1
  954.     fi
  955.  
  956.     # mute mixers
  957.     amixer set Master 0% mute >/dev/null 2>&1
  958.     amixer set PCM 0% mute >/dev/null 2>&1
  959.     
  960.     # output 0.5 sec
  961.     head -c 4000 < /dev/zero | aplay -N -r8000 -fS16_LE -traw -c1 > /dev/null 2>&1 &
  962.     # remember pid
  963.     pp=$!
  964.     # sleep for 2 seconds (to be sure -- 1 sec would be enough)
  965.     sleep 2
  966.     # kill the child process if still exists.
  967.     kill -9 $pp > /dev/null 2>&1
  968.     st=$?
  969.     ac_cardname=`head -n 1 $PROCFS/asound/cards | sed -e 's/^[0-9].* - \(.*\)$/\1/'`
  970.     /sbin/modprobe -r snd-$1 >/dev/null 2>&1
  971.     if [ $st = 0 ]; then
  972.     # irq problem?
  973.     test -n "$LOGFILE" && echo "no playback return" >> "$LOGFILE"
  974.     return 2
  975.     else
  976.     # seems ok!
  977.     test -n "$LOGFILE" && echo "playback OK" >> "$LOGFILE"
  978.     return 0
  979.     fi
  980. }
  981.  
  982. # check capture
  983. # return 0 - OK, 1 - NG, 2 - not working (irq/dma problem)
  984. # ac_try_capture card duplex opts
  985. ac_try_capture () {
  986.     test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE"
  987.     /sbin/modprobe snd-$1 ${*:3} >/dev/null 2>&1
  988.     if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then
  989.     : ;
  990.     else
  991.     /sbin/modprobe -r snd-$1 >/dev/null 2>&1
  992.     return 1
  993.     fi
  994.  
  995.     # mute mixers
  996.     amixer set Master 0% mute >/dev/null 2>&1
  997.     amixer set PCM 0% mute >/dev/null 2>&1
  998.  
  999.     play_pid=0
  1000.     if [ $2 = yes ]; then
  1001.     # try duplex - start dummy playing
  1002.     aplay -N -r8000 -fS16_LE -traw -c1 < /dev/zero > /dev/null 2>&1 &
  1003.     play_pid=$!
  1004.     fi
  1005.     # record 1sec
  1006.     arecord -N -d1 > /dev/null 2>&1 &
  1007.     # remember pid
  1008.     pp=$!
  1009.     # sleep for 2 seconds
  1010.     sleep 2
  1011.     # kill the child process if still exists.
  1012.     kill -9 $pp > /dev/null 2>&1
  1013.     st=$?
  1014.     # kill playback process if any
  1015.     test $play_pid != 0 && kill -9 $play_pid
  1016.     /sbin/modprobe -r snd-$1 >/dev/null 2>&1
  1017.     if [ $st = 0 ]; then
  1018.     test -n "$LOGFILE" && echo "capture no return" >> "$LOGFILE"
  1019.     return 2
  1020.     else
  1021.     test -n "$LOGFILE" && echo "capture OK" >> "$LOGFILE"
  1022.     return 0
  1023.     fi
  1024. }
  1025.  
  1026. get_dma_pair () {
  1027.     case $1 in
  1028.     0)
  1029.     echo 1 3 5;;
  1030.     1)
  1031.     echo 0 3 5;;
  1032.     3)
  1033.     echo 1 0 5;;
  1034.     5)
  1035.     echo 3 1 0;;
  1036.     esac
  1037. }
  1038.  
  1039. #
  1040. # check playback on specified irqs
  1041. #
  1042. # ac_try_irq card opts irqs...
  1043. # return 0 - OK, 1 - NG, 2 - not working (dma problem?)
  1044. #
  1045. ac_try_irq () {
  1046.     card=$1
  1047.     opts="$2 ${mpfx}irq=$3"
  1048.     ac_try_load $card $opts >/dev/null 2>&1
  1049.     result=$?
  1050.     case $result in
  1051.     0)
  1052.     ac_opts="$opts"
  1053.     return 0
  1054.     ;;
  1055.     2)
  1056.     for irq in ${*:4}; do
  1057.         opts="$2 ${mpfx}irq=$irq"
  1058.         ac_try_load $card $opts >/dev/null 2>&1
  1059.         if [ $? = 0 ]; then
  1060.         ac_opts="$opts"
  1061.         return 0
  1062.         fi
  1063.     done
  1064.     return 2
  1065.     ;;
  1066.     esac
  1067.     return 1
  1068. }
  1069.  
  1070. #
  1071. # check playback/capture on dma1 & dma2 & specified irqs
  1072. #
  1073. # ac_try_dmas card opts irqs...
  1074. # return 0 - OK, 1 - NG
  1075. #
  1076. ac_try_dmas () {
  1077.     dma_list=`check_dma_avail 1 0 3 5`
  1078.     for irq in ${*:3}; do
  1079.     for dma1 in $dma_list; do
  1080.         for dma2 in `get_dma_pair $dma1`; do
  1081.         opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq"
  1082.         ac_try_load $1 $opts >/dev/null 2>&1
  1083.         result=$?
  1084.         if [ $result = 1 ]; then
  1085.             if [ $try_all_combination = 1 ]; then
  1086.             continue
  1087.             else
  1088.             return 1
  1089.             fi
  1090.         elif [ $result = 0 ]; then
  1091.             test -n "$LOGFILE" && echo "Now checking capture..." >> "$LOGFILE"
  1092.             ac_opts="$opts"
  1093.             ac_try_capture $1 yes $opts >/dev/null 2>&1 && return 0
  1094.             for d in yes no; do
  1095.             for dma2 in $dma_list; do
  1096.                 if [ $dma1 != $dma2 ]; then
  1097.                 opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq"
  1098.                 ac_opts="$opts"
  1099.                 ac_try_capture $1 $d $opts >/dev/null 2>&1 && return 0
  1100.                 fi
  1101.             done
  1102.             done
  1103.             return 0
  1104.         fi
  1105.         done
  1106.     done
  1107.     done
  1108.     return 1
  1109. }
  1110.  
  1111. # check if the option $2 exists in card $1: set value $3
  1112. ac_check_option () {
  1113.     if /sbin/modinfo -p snd-$1 | grep -q $2; then
  1114.       echo "$2=$3"
  1115.     fi
  1116. }
  1117.  
  1118. ac_try_card_sb8 () {
  1119.     card=sb8
  1120.     irq_list=`check_irq_avail 5 3 9 10 7`
  1121.     for dma8 in `check_dma_avail 1 3`; do
  1122.     opts="${mpfx}dma8=$dma8"
  1123.     ac_try_irq $card "$opts" $irq_list && return 0
  1124.     done
  1125.     return 1
  1126. }
  1127.  
  1128. ac_try_card_sb16 () {
  1129.     card=sb16
  1130.     isapnp=`ac_check_option $card ${mpfx}isapnp 0`
  1131.     opts="$isapnp"
  1132.     irq_list=`check_irq_avail 5 9 10 7 3`
  1133.     dma_list=`check_dma_avail 0 1 3`
  1134.     dma16_list=`check_dma_avail 5 6 7`
  1135.     # at first try auto-probing by driver itself
  1136.     ac_try_load $card $opts >/dev/null 2>&1
  1137.     result=$?
  1138.     case $result in
  1139.     0)
  1140.     ac_opts="$opts"
  1141.     ac_try_capture $card yes $opts >/dev/null 2>&1 && return 0
  1142.     for d in yes no; do
  1143.         for dma8 in $dma_list; do
  1144.         for irq in $irq_list; do
  1145.             opts="${mpfx}dma8=$dma8 ${mpfx}irq=$irq $isapnp"
  1146.             ac_try_capture $card $d $opts >/dev/null 2>&1 && return 0
  1147.         done
  1148.         done
  1149.     done
  1150.     return 0
  1151.     ;;
  1152.     2)
  1153.     for dma16 in $dma16_list; do
  1154.         opts="${mpfx}dma16=$dma16 $isapnp"
  1155.         if ac_try_irq $card "$opts" $irq_list ; then
  1156.         ac_try_capture $card yes $ac_opts >/dev/null 2>&1 && return 0
  1157.         ac_opts_saved="$ac_opts"
  1158.         for d in yes no; do
  1159.             for dma8 in $dma_list; do
  1160.             ac_opts="$ac_opts_saved ${mpfx}dma8=$dma8"
  1161.             ac_try_capture $card $d $ac_opts >/dev/null 2>&1 && return 0
  1162.             done
  1163.         done
  1164.         # return anyway here..
  1165.         return 0
  1166.         fi
  1167.     done
  1168.     ;;
  1169.     esac
  1170.     return 1
  1171. }
  1172.  
  1173. ac_try_card_es1688 () {
  1174.     card=es1688
  1175.     opts=""
  1176.     irq_list=`check_irq_avail 5 9 10 7`
  1177.     for dma8 in `check_dma_avail 1 3 0`; do
  1178.     opts="${mpfx}dma8=$dma8 ${mpfx}mpu_irq=-1"
  1179.     ac_try_irq $card "$opts" $irq_list && return 0
  1180.     done
  1181.     return 1
  1182. }
  1183.  
  1184. ac_try_card_es18xx () {
  1185.     card=es18xx
  1186.     opts=`ac_check_option $card ${mpfx}isapnp 0`
  1187.     ac_try_dmas $card "$opts" `check_irq_avail 5 9 10 7` && return 0
  1188.     return 1
  1189. }
  1190.  
  1191. ac_try_card_cs4236 () {
  1192.     card=cs4236
  1193.     irq_list=`check_irq_avail 5 7 9 11 12 15`
  1194.     isapnp=`ac_check_option $card ${mpfx}isapnp 0`
  1195.     for cport in 0x538 0x210 0xf00; do
  1196.     for port in 0x530 0x534; do
  1197.         opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp"
  1198.         ac_try_dmas $card "$opts" $irq_list && return 0
  1199.     done
  1200.     done
  1201.     return 1
  1202. }
  1203.  
  1204. ac_try_card_cs4232 () {
  1205.     card=cs4232
  1206.     irq_list=`check_irq_avail 5 7 9 11 12 15`
  1207.     isapnp=`ac_check_option $card ${mpfx}isapnp 0`
  1208.     for cport in 0x538 0x210 0xf00; do
  1209.     for port in 0x530 0x534; do
  1210.         opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp"
  1211.         ac_try_dmas $card "$opts" $irq_list && return 0
  1212.     done
  1213.     done
  1214.     return 1
  1215. }
  1216.  
  1217. ac_try_card_cs4231 () {
  1218.     card=cs4231
  1219.     irq_list=`check_irq_avail 5 7 9 11 12 15`
  1220.     for port in 0x530 0x534; do
  1221.     opts="${mpfx}port=$port"
  1222.     ac_try_dmas $card "$opts" $irq_list && return 0
  1223.     done
  1224.     return 1
  1225. }
  1226.  
  1227. ac_try_card_opl3sa2 () {
  1228.     card=opl3sa2
  1229.     irq_list=`check_irq_avail 5 9 3 1 11 12 15 0`
  1230.     isapnp=`ac_check_option $card ${mpfx}isapnp 0`
  1231.     for port in 0x370 0x538 0xf86 0x100; do
  1232.     for wss_port in 0x530 0xe80 0xf40 0x604; do
  1233.         opts="${mpfx}fm_port=-1 ${mpfx}midi_port=-1 ${mpfx}port=$port ${mpfx}wss_port=$wss_port $isapnp"
  1234.         ac_try_dmas $card "$opts" $irq_list && return 0
  1235.     done
  1236.     done
  1237.     return 1
  1238. }
  1239.  
  1240. ac_config_legacy () {
  1241.    title=$(gettext "WARNING")
  1242.    msg=$(gettext "
  1243.    Probing legacy ISA cards might make
  1244.    your system unstable.
  1245.  
  1246.         Do you want to proceed?
  1247.  
  1248. ")
  1249.     $DIALOG --title "$title" --yesno "$msg" 10 50 || acex 0
  1250.  
  1251.     if [ x"$1" = x ]; then
  1252.     probe_list="$LEGACY_CARDS"
  1253.     else
  1254.     probe_list=$*
  1255.     fi
  1256.     menu_args=()
  1257.  
  1258.     for card in $probe_list; do
  1259.     cardname=`/sbin/modinfo -d snd-$card | sed -e 's/^\"\(.*\)\"$/\1/g'`
  1260.     if [ x"$cardname" != x ]; then
  1261.         menu_args=("${menu_args[@]}" "$card" "$cardname" "on")
  1262.     fi
  1263.     done
  1264.     if [ x$menu_args = x ]; then
  1265.     msg=$(gettext "No legacy drivers are available
  1266.    for your machine")
  1267.     $DIALOG --msgbox "$msg" 5 50
  1268.     return 1
  1269.     fi
  1270.     title=$(gettext "Driver Selection")
  1271.     msg=$(gettext "           Probing legacy ISA cards
  1272.  
  1273.         Please select the drivers to probe:")
  1274.     $DIALOG --title "$title" --checklist "$msg" \
  1275.     17 64 8 "${menu_args[@]}" 2> $FOUND || acex 0
  1276.  
  1277.     if [ $try_all_combination != 1 ]; then
  1278.     msg=$(gettext "
  1279.  Shall I try all possible DMA and IRQ combinations?
  1280.  With this option, some unconventional configuration
  1281.  might be found, but it will take much longer time.")
  1282.     if $DIALOG --yesno "$msg" 10 60
  1283.         then
  1284.         try_all_combination=1
  1285.     fi
  1286.     fi
  1287.  
  1288.     xecho "Probing legacy cards..   This may take a few minutes.."
  1289.     echo -n $(gettext "Probing: ")
  1290.     cards=`cat $FOUND | tr -d \"`
  1291.     for card in $cards; do
  1292.     echo -n " $card"
  1293.     ac_opts=""
  1294.     if eval ac_try_card_$card ; then
  1295.         xecho " : FOUND!!"
  1296.         ac_config_card $card $ac_opts
  1297.         return 0
  1298.     fi
  1299.     done
  1300.     echo
  1301.     title=$(gettext "Result")
  1302.     msg=$(gettext "No legacy cards found")
  1303.     $DIALOG --title "$title" --msgbox "$msg" 5 50
  1304.     return 1
  1305. }
  1306.  
  1307. #
  1308. # main part continued..
  1309. #
  1310.  
  1311. if test -n "$LOGFILE" ; then
  1312.     touch "$LOGFILE"
  1313.     echo -n "Starting alsaconf: " >> "$LOGFILE"
  1314.     date >> "$LOGFILE"
  1315. fi
  1316.  
  1317. if [ x"$legacy_probe_card" != x ]; then
  1318.     ac_opts=""
  1319.     if eval ac_try_card_$legacy_probe_card >/dev/null 2>&1; then
  1320.     echo "$ac_opts"
  1321.     echo "$ac_cardname"
  1322.     exit 0
  1323.     else
  1324.     echo "FAILED"
  1325.     exit 1
  1326.     fi
  1327. fi
  1328.  
  1329. intro
  1330.  
  1331. if [ $do_legacy_only = 1 ]; then
  1332.     ac_config_legacy
  1333.     exit 0
  1334. fi
  1335.     
  1336. probe_cards
  1337.  
  1338. devs_found=()
  1339. devs_olist=""
  1340.  
  1341. if [ -s "$FOUND" ]; then
  1342.     while read dev card ; do
  1343.     MODDIR=/lib/modules/`uname -r`
  1344.     find $MODDIR -type f | grep -q -E $card'\.(o|ko)' || continue
  1345.     cardname=`find_device_name $dev | cut -c 1-64`
  1346.     if [ -z "$cardname" ]; then
  1347.         cardname="$card"
  1348.     fi
  1349.     card=${card##snd-}
  1350.     devs_found=("${devs_found[@]}" "$card" "$cardname")
  1351.     devs_devs=("${devs_devs[@]}" "$card" "$dev")
  1352.     done <"$FOUND"
  1353.     devs_olist=`cat $FOUND`
  1354. fi
  1355. if [ x$devs_found != x ]; then
  1356.     #
  1357.     # check for TP600E
  1358.     #
  1359.     if [ ${devs_found[0]} = cs46xx ]; then
  1360.     if $lspci -nv 2>/dev/null| grep -q "Subsystem: 1014:1010"; then
  1361.         msg=$(gettext "
  1362.  Looks like you having a Thinkpad 600E or 770 notebook.
  1363.  On this notebook, CS4236 driver should be used
  1364.  although CS46xx chip is detected.
  1365.  
  1366.  Shall I try to snd-cs4236 driver and probe
  1367.  the legacy ISA configuration?")
  1368.         if $DIALOG --yesno "$msg" 13 60
  1369.         then
  1370.         try_all_combination=1
  1371.         ac_config_legacy cs4236
  1372.         exit 0
  1373.         fi
  1374.     elif $lspci -nv 2>/dev/null| grep -q "Subsystem: 8086:8080"; then
  1375.         msg=$(gettext "
  1376.  Looks like you having a Dell Dimension machine.
  1377.  On this machine, CS4232 driver should be used
  1378.  although CS46xx chip is detected.
  1379.  
  1380.  Shall I try to snd-cs4232 driver and probe
  1381.  the legacy ISA configuration?")
  1382.         if $DIALOG --yesno "$msg" 13 60
  1383.         then
  1384.         try_all_combination=1
  1385.         ac_config_legacy cs4232
  1386.         exit 0
  1387.         fi
  1388.         fi    
  1389.     fi
  1390.    
  1391.     devs_found=("${devs_found[@]}" "legacy" "Probe legacy ISA (non-PnP) chips")
  1392.     title=$(gettext "Soundcard Selection")
  1393.     msg=$(gettext "
  1394.          Following card(s) are found on your system.
  1395.          Choose a soundcard to configure:
  1396. ")
  1397.     $DIALOG --title "$title" --menu "$msg" 17 76 8 "${devs_found[@]}" --output-fd 3 3> $FOUND || acex 0
  1398.     card=`head -n 1 $FOUND`
  1399.     if [ "$card" = "legacy" ]; then
  1400.     ac_config_legacy
  1401.     else
  1402.     ac_config_card "$card"
  1403.     fi
  1404.     exit 0
  1405. else
  1406.     msg=$(gettext "
  1407.         No supported PnP or PCI card found.
  1408.  
  1409.  Would you like to probe legacy ISA sound cards/chips?
  1410.  
  1411. ")
  1412.     if $DIALOG --yesno "$msg" 9 60 ; then
  1413.     ac_config_legacy
  1414.     exit 0
  1415.     fi
  1416. fi
  1417.  
  1418. rm -f "$FOUND" "$DUMP"
  1419. exit 0
  1420.